cc.Class({
    extends: cc.Component,

    properties: {
        //没有套中牛
        rope_empty: {
            type: cc.SpriteFrame,
            default: null
        },
        //已经套中牛
        rope_cow: {
            type: cc.SpriteFrame,
            default: []
        }
    },
    //没有套中牛
    emptyRope() {
        var rope_empty_sprite = this.node.getComponent(cc.Sprite)
        rope_empty_sprite.spriteFrame = this.rope_empty
    },
    //套中牛
    setRope(index){
        var rope_sprite = this.node.getComponent(cc.Sprite)
        rope_sprite.spriteFrame = this.rope_cow[index]
    },
    throwRope () {
        if (this.is_throw) return
        this.is_throw = true
        //抛出套绳移动到最高点
        var top = cc.moveTo(0.5, cc.v2(0, 130))  // (duration, v2)
        //判断是否套中
        /* 一般cc.callFunc表示一个动作，和其他action(cc.moveTo、 cc.scaleTo 等等)一样的数据类型，
        可以当作runaction 的参数。但是普通定义的fun 就不是该数据类型，也不能当node.runaction的参数。
        就当成对普通fun的封装吧，封装成action的数据类型。 
        如果你直接调用一个fun 没有时效顺序考虑的话当然可以直接调用这个fun而不用去封装。 */
        var topFn = cc.callFunc(function() {  // 抛出到顶点时的回调函数
            var index = this.game.catchCow()
            if (index !== -1) { // 套到了牛
                //显示粒子特效
                this.fireworks.resetSystem()
                // 换为牛&绳
                this.setRope(index)
            } 
        }.bind(this), this.node)
        var finish = cc.moveTo(0.5, cc.v2(0, -480))  // 收回后的回调函数
        var finishFn = cc.callFunc(function() {
            // 换为空绳
            this.is_throw = false
            this.emptyRope()
        }.bind(this), this.node)
        var seq = cc.sequence([top, topFn, finish, finishFn])
        this.node.runAction(seq)
    },
    onLoad () {
        //防止套绳过程被打断
        this.is_throw = false
        this.game = cc.find('Canvas').getComponent('game')
        this.fireworks = this.node.getChildByName('fireworks').getComponent(cc.ParticleSystem)

    },

    start () {

    },

    // update (dt) {},
});
